7 Frame 和 windw
7.1 弹窗和 window 的方法
弹窗(popup)就是打开一个给定 URL 的新窗口。大多数浏览器都配置为在新选项卡中打开 URL,而不是一个单独的窗口。
window.open("https://www.xxx.com/")
目前,进行OAuth 授权(使用 Google/Facebook/ ...登录),仍要使用弹窗,因为:
- 弹窗是一个独立的窗口,有自己独立的 JavaScript 环境。因此为了安全起见,常用弹窗方式打开一个不信任的第三方网站。
- 打开弹窗的代码很容易实现。
7.1.1 阻止弹窗
如果弹窗是在用户触发的事件处理程序(如 onclick
)之外调用,大多数浏览器都会默认阻止此类弹窗。
window.open('https://javascript.info'); // 弹窗被阻止
button.onclick = () => { // 弹窗被允许
window.open('https://javascript.info');
};
7.1.2 打开弹窗
window.open(url, name, params)
- url:要在新窗口中加载的 URL。
- name:新窗口的名称。每个窗口都有一个
window.name
,指定哪个窗口用于打开URL网页。- 如果已经有 name 名字的窗口,将在该窗口打开给定的 URL;否则会打开一个新窗口。
- params:新窗口的配置字符串。它包括设置,用逗号分隔。参数之间不能有空格,
- 例如:
width=200,height=100
。
- 例如:
params
的设置项:
- 位置:
left/top
(数字):屏幕上窗口的左上角的坐标。这有一个限制:不能将新窗口置于屏幕外(offscreen)。width/height
(数字):新窗口的宽度和高度。宽度/高度的最小值是有限制的,因此不可能创建一个不可见的窗口。
- 窗口功能:
menubar
(yes/no):显示或隐藏新窗 口的浏览器菜单。toolbar
(yes/no):显示或隐藏新窗口的浏览器导航栏(后退,前进,重新加载等)。location
(yes/no):显示或隐藏新窗口的 URL 字段。Firefox 和 IE 浏览器不允许默认隐藏它。status
(yes/no):显示或隐藏状态栏。同样,大多数浏览器都强制显示它。resizable
(yes/no):允许禁用新窗口大小调整。不建议使用。scrollbars
(yes/no):允许禁用新窗口的滚动条。不建议使用。
7.1.3 操纵/关闭弹窗
操作弹窗
open
调用会返回对新窗口的引用。它可以用来操纵弹窗的属性,更改位置,甚至更多操作。
- 同源策略:只有在窗口是同源的时,窗口才能自由访问彼此的内容(
相同的协议://domain:port
)。
关闭弹窗
关闭一个窗口:win.close()
。
检查一个窗口是否被关闭:win.closed
。true 则表明已经被关闭
调整弹窗
win.moveBy(x,y)
: 将窗口相对于当前位置向右移动x
像素,向下移动y
像素。- 允许负值(向上/向左移动)。
win.moveTo(x,y)
:将窗口移动到屏幕上的坐标(x,y)
处。win.resizeBy(width,height)
:根据给定的相对于当前大小的width/height
调整窗口大小。允许负值。win.resizeTo(width,height)
:将窗口调整为给定的大小。window.onresize
事件:当窗口尺寸发生改变,触发该事件。
没有最小化/最大化。无法通过 JavaScript 最小化、最大化个窗口。
滚动窗口
win.scrollBy(x,y)
:相对于当前位置,将窗口向右滚动x
像素,并向下滚动y
像素。允许负值。win.scrollTo(x,y)
:将窗口滚动到给定坐标(x,y)
。elem.scrollIntoView(top = true)
:滚动窗口,使elem
显示在elem.scrollIntoView(false)
的顶部(默认)或底部。window.onscroll
事件:窗口发生滚动时触发。
聚焦/失焦
window.focus()
和 window.blur()
方法可以使窗口获得或失去焦点。
在实际中它们被进行了严格地限制,因为在过去,恶意网站滥用这些方法。